package com.msblearn.C_005;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * T10_ReentrantLock:可重入锁
 * reentrantlock 可用户替代synchronized
 * 由于 m1锁定的是this,只有m1执行完毕的时候，m2才可以执行。
 *
 */
public class T01_ReentrantLock3 {
    Lock lock = new ReentrantLock();

    private void m1() {
        try {
            lock.lock();
            for (int i = 0; i < 6; i++) {
                TimeUnit.SECONDS.sleep(1);
                System.out.println(i);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            //必须写在finally
            lock.unlock();
        }

    }

    //可以使用trylock去尝试获取锁，不管锁定与否，方法都会继续执行
    //可以根据trylock的返回值类判断是否锁定。
    //也可以指定trylock的时间，由于trylock(time)抛出异常，所以要注意unlock的处理。必须放在finally中
    private void m2() {
        boolean isLocked = false;
        try {
            isLocked = lock.tryLock(5,TimeUnit.SECONDS);

            System.out.println("m2....."+isLocked);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if(isLocked) lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        T01_ReentrantLock3 reentrantLock1 = new T01_ReentrantLock3();
        new Thread(reentrantLock1::m1).start();
        TimeUnit.SECONDS.sleep(1);
        //会等待m1完成才会执行。等待锁。
        new Thread(reentrantLock1::m2).start();

    }
}
